// 数组类型

// First

// 提取第一个元素的类型

type arr = [1, 2, 3, 4];

type GetFirst<Arr extends unknown[]> = Arr extends [infer A, ...unknown[]] ? A : never;

type res = GetFirst<arr>;

/**
 * any 和 unknown 的区别： any 和 unknown 都代表任意类型，但是 unknown 只能接收任意类型的值，而 any 除了可以接收任意类型的值，也可以赋值给任意类型（除了 never）。类型体操中经常用 unknown 接受和匹配任何类型，而很少把任何类型赋值给某个类型变量。
 */

// 提取最后一个元素类型
type GetLast<Arr extends unknown[]> = Arr extends [...unknown[], infer Last] ? Last : never;

type res2 = GetLast<arr>;

// 取剩余的数组

type PopArr<Arr extends unknown[]> = Arr extends []
  ? []
  : Arr extends [unknown, ...infer Rest, unknown]
  ? Rest
  : never;

type res3 = PopArr<arr>;
type res4 = PopArr<[]>;

// ShiftArr 排除第一项，取剩余类型
type ShiftArr<Arr extends unknown[]> = Arr extends []
  ? []
  : Arr extends [unknown, ...infer Reset]
  ? Reset
  : never;

type res5 = ShiftArr<arr>;

export {};
